package cn.iocoder.yudao.module.system.service.expert;

import java.util.*;
import javax.validation.*;

import cn.iocoder.yudao.module.system.controller.admin.expert.vo.*;
import cn.iocoder.yudao.module.system.dal.dataobject.expert.ExpertDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;

/**
 * 专家 Service 接口
 *
 * @author 芋道源码
 */
public interface ExpertService {

    /**
     * 创建专家
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createExpert(@Valid ExpertSaveReqVO createReqVO);

    /**
     * 更新专家
     *
     * @param updateReqVO 更新信息
     */
    void updateExpert(@Valid ExpertSaveReqVO updateReqVO);

    /**
     * 删除专家
     *
     * @param id 编号
     */
    void deleteExpert(Long id);

    /**
     * 获得专家
     *
     * @param id 编号
     * @return 专家
     */
    ExpertDO getExpert(Long id);

    /**
     * 获得专家
     *
     * @param name 专家名称
     * @return 专家
     */
    ExpertDO getExpertByName(String name);

    /**
     * 获得专家分页
     *
     * @param pageReqVO 分页查询
     * @return 专家分页
     */
    PageResult<ExpertDO> getExpertPage(ExpertPageReqVO pageReqVO);

    /**
     * 根据类型获得专家列表
     */
    List<ExpertDO> selectByExpertTypes(List<Integer> expertTypes);

    /**
     * 获得使用最少积分的专家
     */
    ExpertDO getUseMinimumPointsExpert();

    /**
     * 获得使用最多积分的专家
     */
    ExpertDO getUseMaximumPointsExpert();

}